{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Understanding Hyperbole using RSA\n",
    "\n",
    "    \"My new kettle cost a million dollars.\"\n",
    "\n",
    "Hyperbole -- using an exagerated utterance to convey strong opinions -- is a common non-literal use of language. Yet non-literal uses of langauge are impossible under the simplest RSA model. Kao, et al, suggested that two ingredients could be added to ennable RSA to capture hyperbole. First, the state conveyed by the speaker and reasoned about by the listener should include affective dimensions. Second, the speaker only intends to convey information relevant to a particular topic, such as \"how expensive was it?\" or \"how am I feeling about the price?\"; pragmatic listeners hence jointly reason about this topic and the state."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "#first some imports\n",
    "import torch\n",
    "torch.set_default_dtype(torch.float64)  # double precision for numerical stability\n",
    "\n",
    "import collections\n",
    "import argparse\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "import pyro\n",
    "import pyro.distributions as dist\n",
    "import pyro.poutine as poutine\n",
    "\n",
    "from search_inference import factor, HashingMarginal, memoize, Search"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As in the simple RSA example, the inferece helper `Marginal` takes an un-normalized stochastic function, constructs the distribution over execution traces by using `Search`, and constructs the marginal distribution on return values (via `HashingMarginal`)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "def Marginal(fn):\n",
    "    return memoize(lambda *args: HashingMarginal(Search(fn).run(*args)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The domain for this example will be states consisting of price (e.g. of a tea kettle) and the speaker's emotional arousal (whether the speaker thinks this price is irritatingly expensive). Priors here are adapted from experimental data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "State = collections.namedtuple(\"State\", [\"price\", \"arousal\"])\n",
    "\n",
    "def price_prior():\n",
    "    values = [50, 51, 500, 501, 1000, 1001, 5000, 5001, 10000, 10001]\n",
    "    probs = torch.tensor([0.4205, 0.3865, 0.0533, 0.0538, 0.0223, 0.0211, 0.0112, 0.0111, 0.0083, 0.0120])\n",
    "    ix = pyro.sample(\"price\", dist.Categorical(probs=probs))\n",
    "    return values[ix]\n",
    "\n",
    "def arousal_prior(price):\n",
    "    probs = {\n",
    "        50: 0.3173,\n",
    "        51: 0.3173,\n",
    "        500: 0.7920,\n",
    "        501: 0.7920,\n",
    "        1000: 0.8933,\n",
    "        1001: 0.8933,\n",
    "        5000: 0.9524,\n",
    "        5001: 0.9524,\n",
    "        10000: 0.9864,\n",
    "        10001: 0.9864\n",
    "    }\n",
    "    return pyro.sample(\"arousal\", dist.Bernoulli(probs=probs[price])).item() == 1\n",
    "\n",
    "def state_prior():\n",
    "    price = price_prior()\n",
    "    state = State(price=price, arousal=arousal_prior(price))\n",
    "    return state"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we define a version of the RSA speaker that only produces *relevant* information for the literal listener. We define relevance with respect to a Question Under Discussion (QUD) -- this can be thought of as defining the speaker's current attention or topic.\n",
    "\n",
    "The speaker is defined mathematically by:\n",
    "\n",
    "$$P_S(u|s,q) \\propto \\left[ \\sum_{w'} \\delta_{q(w')=q(w)} P_\\text{Lit}(w'|u) p(u) \\right]^\\alpha $$\n",
    "\n",
    "To implement this as a probabilistic program, we start with a helper function `project`, which takes a distribution over some (discrete) domain and a function `qud` on this domain. It creates the push-forward distribution, using `Marginal` (as a Python decorator). The speaker's relevant information is then simply information about the state in this projection."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "@Marginal\n",
    "def project(dist,qud):\n",
    "    v = pyro.sample(\"proj\",dist)\n",
    "    return qud_fns[qud](v)\n",
    "\n",
    "@Marginal\n",
    "def literal_listener(utterance):\n",
    "    state=state_prior()\n",
    "    factor(\"literal_meaning\", 0. if meaning(utterance, state.price) else -999999.)\n",
    "    return state\n",
    "\n",
    "@Marginal\n",
    "def speaker(state, qud):\n",
    "    alpha = 1.\n",
    "    qudValue = qud_fns[qud](state)\n",
    "    with poutine.scale(scale=torch.tensor(alpha)):\n",
    "        utterance = utterance_prior()\n",
    "        literal_marginal = literal_listener(utterance)\n",
    "        projected_literal = project(literal_marginal, qud)\n",
    "        pyro.sample(\"listener\", projected_literal, obs=qudValue)\n",
    "    return utterance\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The possible QUDs capture that the speaker may be attending to the price, her affect, or some combination of these. We assume a uniform QUD prior."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "#The QUD functions we consider:\n",
    "qud_fns = {\n",
    "    \"price\": lambda state: State(price=state.price, arousal=None),\n",
    "    \"arousal\": lambda state: State(price=None, arousal=state.arousal),\n",
    "    \"priceArousal\": lambda state: State(price=state.price, arousal=state.arousal),\n",
    "}\n",
    "\n",
    "def qud_prior():\n",
    "    values = list(qud_fns.keys())\n",
    "    ix = pyro.sample(\"qud\", dist.Categorical(probs=torch.ones(len(values)) / len(values)))\n",
    "    return values[ix]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we specify the utterance meanings (standard number word denotations: \"N\" means exactly $N$) and a uniform utterance prior. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "def utterance_prior():\n",
    "    utterances = [50, 51, 500, 501, 1000, 1001, 5000, 5001, 10000, 10001]\n",
    "    ix = pyro.sample(\"utterance\", dist.Categorical(probs=torch.ones(len(utterances)) / len(utterances)))\n",
    "    return utterances[ix]\n",
    "\n",
    "def meaning(utterance, price):\n",
    "    return utterance == price"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "OK, let's see what number term this speaker will say to express different states and QUDs."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#silly plotting helper:\n",
    "def plot_dist(d):\n",
    "    support = d.enumerate_support()\n",
    "    data = [d.log_prob(s).exp().item() for s in d.enumerate_support()]\n",
    "    names = support\n",
    "\n",
    "    ax = plt.subplot(111)\n",
    "    width=0.3\n",
    "    bins = list(map(lambda x: x-width/2,range(1,len(data)+1)))\n",
    "    ax.bar(bins,data,width=width)\n",
    "    ax.set_xticks(list(map(lambda x: x, range(1,len(data)+1))))\n",
    "    ax.set_xticklabels(names,rotation=45, rotation_mode=\"anchor\", ha=\"right\")\n",
    "\n",
    "\n",
    "# plot_dist( speaker(State(price=50, arousal=False), \"arousal\") )\n",
    "# plot_dist( speaker(State(price=50, arousal=True), \"price\") )\n",
    "plot_dist( speaker(State(price=50, arousal=True), \"arousal\") )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Try different values above! When will the speaker favor non-literal utterances?"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Finally, the pragmatic listener doesn't know what the QUD is and so jointly reasons abut this and the state."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "@Marginal\n",
    "def pragmatic_listener(utterance):\n",
    "    state = state_prior()\n",
    "    qud = qud_prior()\n",
    "    speaker_marginal = speaker(state, qud)\n",
    "    pyro.sample(\"speaker\", speaker_marginal, obs=utterance)\n",
    "    return state"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "How does this listener interpret the uttered price \"10,000\"? On the one hand this is a very unlikely price *a priori*, on the other if it were true it would come with strong arousal. Altogether this becomes a plausible *hyperbolic* utterence:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbwAAAF2CAYAAAAVwy0NAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzsnXe8HkXV+L8nlRBKAgkgIRUChNBT6J1AIFSlI4KiiIiKBUF6UenSVUCKP7AhokYBkSo2NBEBKSL11aDva8H66qsi8/vjnOWZu3f3uc+zu/dubvZ8P5/53Ltl9szssztnzpkzsxJCwHEcx3GWdYbUXQDHcRzHGQhc4TmO4ziNwBWe4ziO0whc4TmO4ziNwBWe4ziO0whc4TmO4ziNwBVeG0Rkvog8IyLPicjJGcc/ICJPicjjInKfiEyOjv1HRB61tHBgS+44juOkEZ+Hl42IDAV+AcwDlgCLgENDCE9F5+wE/CiE8HcReRewYwjhYDv2txDCCjUU3XEcx8nALbx85gLPhRBeCCH8C/gisG98QgjhgRDC323zYWCtAS6j4ziO0yGu8PKZAPwq2l5i+/I4Grgr2l5ORBaLyMMisl9/FNBxHMfpnGF1F2BZQETeDMwGdoh2Tw4hvCwi04D7ReRnIYTnM/IeAxwDMHr06Fnrr7/+gJTZcRxnWeAnP/nJ70MI4zs51xVePi8DE6PttWxfD0RkV+BUYIcQwj+T/SGEl+3vCyLyILAZ0EvhhRCuBa4FmD17dli8eHGFVXAcx1m2EZH/6vRcd2nmswiYLiJTRWQEcAjQI9pSRDYDrgH2CSH8Nto/VkRG2v/jgG2Ap3Acx3Fqwy28HEIIr4rI8cDdwFDghhDCkyJyDrA4hLAQuAhYAfiyiAD8MoSwDzADuEZEXkM7FefH0Z2O4zjOwOPTEpYi3KXpOI7THSLykxDC7E7OdZem4ziO0whc4TmO4ziNwBWe4ziO0whc4TmO4ziNwBWe4ziO0wh8WoLjOE7DmHLyHb32vXT+ghpKMrC4hec4juM0Ald4juM4TiNwhec4juM0Ald4juM4TiNwhec4juM0Ald4juM4TiNwhec4juM0Ap+H5wC95+U0YU6O4zjNwi08x3EcpxG4wnMcx3EagSs8x3EcpxG4wnMcx3EagSs8x3EcpxG4wnMcx3EagSs8x3EcpxG4wnMcx3EagSs8x3EcpxG4wnMcx3EagSs8x3EcpxG4wnMcx3EagSs8x3EcpxG4wnMcx3EagSs8x3EcpxH49/Cc2kl/iw/8e3yO41SPW3iO4zhOI3CF5ziO4zQCV3iO4zhOI3CF5ziO4zQCV3iO4zhOI3CF1wYRmS8iz4jIcyJycsbxD4jIUyLyuIjcJyKTo2NHisizlo4c2JI7juM4aVzh5SAiQ4GrgT2ADYBDRWSD1Gk/BWaHEDYGbgMutLyrAGcCWwBzgTNFZOxAld1xHMfpjSu8fOYCz4UQXggh/Av4IrBvfEII4YEQwt9t82FgLft/d+CeEMIrIYQ/AvcA8weo3I7jOE4GrvDymQD8KtpeYvvyOBq4q9u8InKMiCwWkcW/+93vShTXcRzHaYcrvAoQkTcDs4GLus0bQrg2hDA7hDB7/Pjx1RfOcRzHAVzhteNlYGK0vZbt64GI7AqcCuwTQvhnN3kdx3GcgcMVXj6LgOkiMlVERgCHAAvjE0RkM+AaVNn9Njp0N7CbiIy1YJXdbJ/jOI5TE754dA4hhFdF5HhUUQ0FbgghPCki5wCLQwgLURfmCsCXRQTglyGEfUIIr4jIuajSBDgnhPBKDdVwHMdxDFd4bQgh3Ancmdp3RvT/rm3y3gDc0H+lcxzHcbrBXZqO4zhOI3CF5ziO4zQCV3iO4zhOI3CF5ziO4zQCV3iO4zhOI3CF5ziO4zQCV3iO4zhOI3CF5ziO4zQCV3iO4zhOI3CF5ziO4zQCV3iO4zhOI3CF5ziO4zQCV3iO4zhOI3CF5ziO4zQCV3iO4zhOI3CF5ziO4zQCV3iO4zhOI3CF5ziO4zQCV3iO4zhOI3CF5ziO4zQCV3iO4zhOI3CF5ziO4zQCV3iO4zhOI3CF5ziO4zQCV3iO4zhOI3CF5ziO4zQCV3iO4zhOI3CF5ziO4zQCV3iO4zhOI3CF5ziO4zQCV3iO4zhOI3CF5ziO4zQCV3iO4zhOI3CF5ziO4zQCV3htEJH5IvKMiDwnIidnHN9eRB4RkVdF5IDUsf+IyKOWFg5cqR3HcZwshtVdgKUVERkKXA3MA5YAi0RkYQjhqei0XwJHAR/KuMQ/Qgib9ntBHcdxnI5whZfPXOC5EMILACLyRWBf4HWFF0J4yY69VkcBHcdxnM5xl2Y+E4BfRdtLbF+nLCcii0XkYRHZr9qiOY7jON3iFl7/MTmE8LKITAPuF5GfhRCeT58kIscAxwBMmjRpoMvoOI7TGNzCy+dlYGK0vZbt64gQwsv29wXgQWCznPOuDSHMDiHMHj9+fPHSOo7jOG1xhZfPImC6iEwVkRHAIUBH0ZYiMlZERtr/44BtiMb+HMdxnIHHFV4OIYRXgeOBu4GngVtDCE+KyDkisg+AiMwRkSXAgcA1IvKkZZ8BLBaRx4AHgPNT0Z2O4zjOAONjeG0IIdwJ3Jnad0b0/yLU1ZnO9wNgo34voOM4jtMxbuE5juM4jcAVnuM4jtMIXOE5juM4jcAVnuM4jtMIXOE5juM4jcAVnuM4jtMIXOE5juM4jcAVnuM4jtMIXOE5juM4jcAVnuM4jtMIXOE5juM4jcAVnuM4jtMIXOE5juM4jcAVnuM4jtMIXOE5juM4jcAVnuM4jtMIXOE5juM4jcAVnuM4jtMIXOE5juM4jcAVnuM4jtMIXOE5juM4jcAVnuM4jtMIXOE5juM4jcAVnuM4jtMIXOE5juM4jcAVnuM4jtMIXOE5juM4jcAVnuM4jtMIXOE5juM4jcAVnuM4jtMIXOE5juM4jcAVnuM4jtMIXOE5juM4jcAVnuM4jtMIXOE5juM4jcAVXhtEZL6IPCMiz4nIyRnHtxeRR0TkVRE5IHXsSBF51tKRA1dqx3EcJwtXeDmIyFDgamAPYAPgUBHZIHXaL4GjgM+n8q4CnAlsAcwFzhSRsf1dZsdxHCcfV3j5zAWeCyG8EEL4F/BFYN/4hBDCSyGEx4HXUnl3B+4JIbwSQvgjcA8wfyAK7TiO42TjCi+fCcCvou0ltq/SvCJyjIgsFpHFv/vd7woV1HEcx+kbV3g1E0K4NoQwO4Qwe/z48XUXx3EcZ5nFFV4+LwMTo+21bF9/53Ucx3H6AVd4+SwCpovIVBEZARwCLOww793AbiIy1oJVdrN9juM4Tk24wsshhPAqcDyqqJ4Gbg0hPCki54jIPgAiMkdElgAHAteIyJOW9xXgXFRpLgLOsX2O4zhOTQyruwBLMyGEO4E7U/vOiP5fhLors/LeANzQrwV0HMdxOsYtPMdxHKcRuMJzHMdxGoErPMdxHKcRuMJzHMdxGoErPMdxHKcRuMJzHMdxGoErPMdxHKcRuMJzHMdxGoErPMdxHKcRuMJzHMdxGoErPMdxHKcRuMJzHMdxGoErPMdxHKcRuMJzHMdxGoErPMdxHKcRuMJzHMdxGoErPMdxHKcRuMJzHMdxGsGwugvgOHUz5eQ7emy/dP6C2mQPtHzHaRJu4TmO4ziNwBWe4ziO0whc4TmO4ziNwBWe4ziO0whc4TmO4ziNwBWe4ziO0whc4TmO4ziNwBWe4ziO0whc4TmO4ziNwBWe4ziO0whc4TmO4ziNwBWe4ziO0whc4TmO4ziNwBWe4ziO0whc4TmO4ziNwBVeG0Rkvog8IyLPicjJGcdHisiX7PiPRGSK7Z8iIv8QkUctfXqgy+44juP0xD8Am4OIDAWuBuYBS4BFIrIwhPBUdNrRwB9DCOuIyCHABcDBduz5EMKmA1pox3EcJxe38PKZCzwXQnghhPAv4IvAvqlz9gU+a//fBuwiIjKAZXQcx3E6xBVePhOAX0XbS2xf5jkhhFeBPwOr2rGpIvJTEfmOiGzX34V1HMdx2uMuzf7hN8CkEMIfRGQW8DURmRlC+Ev6RBE5BjgGYNKkSQNcTMdxnObgFl4+LwMTo+21bF/mOSIyDFgZ+EMI4Z8hhD8AhBB+AjwPrJslJIRwbQhhdghh9vjx4yuuguM4jpPgCi+fRcB0EZkqIiOAQ4CFqXMWAkfa/wcA94cQgoiMt6AXRGQaMB14YYDK7TiO42TgLs0cQgivisjxwN3AUOCGEMKTInIOsDiEsBC4HrhZRJ4DXkGVIsD2wDki8m/gNeDYEMIrA18Lx3EcJ8EVXhtCCHcCd6b2nRH9/3/AgRn5vgJ8pd8L6DiO43SMuzQdx3GcRuAKz3Ecx2kErvAcx3GcRuAKz3Ecx2kErvAcx3GcRuAKz3Ecx2kErvAcx3GcRuAKz3Ecx2kEPvHccRrMlJPv6LXvpfMX1FASx+l/3MJzHMdxGoFbeI7j1IJbl85A4xae4ziO0whc4TmO4ziNwBWe4ziO0whc4TmO4ziNwBWe4ziO0wg8SnMZwSPeHMdx2uMWnuM4jtMI3MJzSuPWpeM4gwG38BzHcZxG4Bae4ziOM2DU6RFyC89xHMdpBG7hOY7TSOq0NHzcux7cwnMcx3EagSs8x3EcpxG4wnMcx3EagSs8x3EcpxG4wnMcx3EagSs8x3EcpxG4wnMcx3EagSs8x3EcpxG4wnMcx3EagSs8x3EcpxG4wnMcx3EagSu8NojIfBF5RkSeE5GTM46PFJEv2fEficiU6NhHbP8zIrL7QJbbcRzH6Y0vHp2DiAwFrgbmAUuARSKyMITwVHTa0cAfQwjriMghwAXAwSKyAXAIMBNYE7hXRNYNIfxnYGvhOM6yiC8+XQy38PKZCzwXQnghhPAv4IvAvqlz9gU+a//fBuwiImL7vxhC+GcI4UXgObue4ziOUxNu4eUzAfhVtL0E2CLvnBDCqyLyZ2BV2/9wKu+E/itqs/HPvDiO0wkSQqi7DEslInIAMD+E8HbbPgLYIoRwfHTOE3bOEtt+HlWKZwEPhxBusf3XA3eFEG7LkHMMcIxtrgc8U2E1xgG/ryHvYM8/mMted/7BXPay+Qdz2cvmr1P25BDC+E5OdAsvn5eBidH2WrYv65wlIjIMWBn4Q4d5AQghXAtcW1GZeyAii0MIswc672DPP5jLXnf+wVz2svkHc9nL5q+77J3iY3j5LAKmi8hUERmBBqEsTJ2zEDjS/j8AuD+oybwQOMSiOKcC04EfD1C5HcdxnAzcwsvBxuSOB+4GhgI3hBCeFJFzgMUhhIXA9cDNIvIc8AqqFLHzbgWeAl4F3u0Rmo7jOPXiCq8NIYQ7gTtT+86I/v8/4MCcvB8DPtavBeybMq7Ssm7WwZx/MJe97vyDuexl8w/mspfNX3fZO8KDVhzHcZxG4GN4juM4TiNwhecsldgE/gHPWxYRGdTvVM33rjbZdcuvu+5NYVC/nE5vkga3aMMrImOyrtdF/qH2t+sXWETGiMhQERkSQggFZI8FCDX46UVknMl+zba7vv81N7ijRUSquHfd1kNExlYluwiDue4iMqTsO18Gi0Qfaf+Xen4H4vn3MbxlCGvwjwDuCyE8WSD/EOBm4EU0uvR8C8zpNP/KwBnAl4CnQgh/61L2lcCfgTWA94UQ/tpF/qHAVcD/oZG1i0IIf+gi/xrAusA/QgiLOs0X5f8M8Dd0GbmvhBB+Y4r7tQ7zjwN2BV4JIXy7gPxJwBjgdyGE33SZdwV08YNNgdOBv4QQ/thF/rWAycDfQgiPdSl7OPB+YA5wEfDbEMJLXV6jkXUXkfHAUcAoNIp8STfy7RoTgBkhhHsL5F0ZeBuwCRqg96su24tJwMbAQyGEv9i+jt+ZIrjCW4awRat3BA4Dvgw83W3jKSIroS/w24CtgTeHEJ7tIu/+wJ7As8AvQgj/rwvZy6ORw2ehL9H56Io1HSk+y384OtF/K+CdtpZpJ3l3R1e6ORRdN/X2EMKv2ufqkX8oeu+3RDsd+4cQnu70BRaRWeh8zQ+iv90PQwjf7UL+XugargK8aFHCneYdDqwAHIcudv4K8NUQwiMd5t8F2A7YHHgC+FgI4X+7kD8EVTprAlOAG0MID3SRv5F1t2duC/SZeyNwOfCTEMILXcjfCjgXuA/4cwjhk13kFXTJxH2BnYDvA9/rtMMoIhujHeSngeEhhJOT6/abtR9C8LSMJfTlezdqrR1d4jofA+4BNrTtIR3mmwbsjVpapxSU/W7gC8AC25Yu8i4HnIauczqtS7nTgVuA84B5Bcv+YdTSm9HNfbNzJwNnA5d2+9uhDfcUdNGETwDjOsgjqe0tgQ8AtwJzupS/CvAN4BLUamn7m2XInoRaLD8CdvG6t80/JLV9AOoh+QiwTpdlXw3Y3dqL2zvMk5a/A3Aq6mXZotN7j65OtS5wO6p0Jev6VaXKL+hp4FPWy4WuTbe3KY19OskPbGAP38To2BnWiCzXQf7h0f+CWmn3Au/oIO8sYDaweXTsHajSHN+mnkn+CcCU1LFTge8Bq3V579ZE3VsXAOt3UPbp6KegVo6OnYgqvbU6/e2Sl9wazzejPfb5BX77lYGvAJd2+LuPI1IQqIV8Aqo4Vu9S9opoo38psGqHv9u01LEj0K+PrOt1b1v2VYBh0f7t7Jk5Mn6e+rhG/PwNQ5X2Nzq8d6ulnvkZwMn23o3pRrZt3w480O4el02VXszTwKfo4VmAuiauTh42YCX0m30fAUa0e4BQt8QPgU+iPb3tomNXAlf08QLtbefcGL+swG7WAExuk3cfdOm1s1EFt0907ELgq8DQNvn3A74LfM3KMC06dibw1j7u3TzUjfo+TMEB44FPAyf2cf/3Q7+M8f/QT0VtER07xX6TzLJH8vdEG9iLMYVvv92JwOkd/PbboZbJPKx3b/kfBj7aR/n3st/9ZuAL0f6NgcuATWJZGbJ3Bj6KLrGXlH002mhf0IfsvYHF6JjvQkzx2L0/NXkOsp7bJtfd9u8BPGDyL4v2L0AtpXbvW1L+LVEX/mxgRHT8C8BH+ij/nnaPL0VdwMn+OcDngY36uHfJ77ZrXFb0Xf90O9llUr9c1NPAJnvZFwEbouMIN9OyFja0F2pum/wT7eVZ3h7C7wNjgZF2fLK9WKNy8u9g8qfY3y+gPnnQHvOVwM45eccD37ZG6p0me1wi2845H5iUk38m8CDq0vqQNSIrRcffBFzZpu57Wpn3Q5Xtp7FeMzAVeBzYNSfvVNSCHYW6YH9s9y3JvznwiT5+u90t31bAN4GvR/mTz0wd0Cb/AuAxk/99VEmOsGOro+OBG+XknW3XnwQci467xvfuROBrfdy7R9BG825UaSeyxwD3A7vl5N0I+I79/kegy/DF1sLhwB193LtG1h1VVI+iivk89PlfMTr+YXTlkhFtrrE78HO7d69YPYZF1z83Lz/qjVmMeoOOB36WKv970DZn+TaynwbeCjyPWtRJWzMetZIz3/eyyaclDGKiMOQdgHehiunPwKkhhNdEZGgI4Ql0TOKNNkCfxXDgSTTY5U3AW4JGqm0uIisCv0OnsKyXI38u6vpcH43uPCmE8G8RGRY0cuwB4DALKknzH/R7gUdYOjKE8HtgGxGZLPoViv9B3Td5Zb8LXcf0jcBBIYS/iMimACGErwCvisjMnPzbWL5XUXfYuUHXUV05aMDLx9AGLIshaMNzNNpIHWr3bZbd+0eAf4pI+juKMZuhFsJ4VFm+x+SvEkJ4Ge3tT8gKOReRUWjjMR9tNEcBt4QQ/iUiK4YQ/gf9XVfOkf0aalVuiY4f7Wb3bguAEMJFwHcsgjUtW1AlvS/6fKwCXGKyVw0h/Am1evOeuf9DO0b7oY3ughDCn0VkO5P9OeBBEVkvK3OT646OUZ+OfntzF+CoEMJfRWRzO/459Ln8d0bZh4jIKugzl1iZS9CF71+1055DO2s75cj/D+ruXxd9Z/ex8m9jx68G7kC9SmnZK5jcfdHf5y/Al0II/7TpDf+LuoY3y5Fdjv7Qop76N9FyC4y1v6ehD/k9wHTbdzDaSxXUeuo1CI8+1MlYw43og76Bbe+KvgzTbHsUsEJK/mr29yh03OQhYG3bdwTaU0sszU2JXHvo+N5s+/9S4De03CA7oi9sEvSxHNaDjWTPRl+oaagLaVFU993Rwf9Jtt3DYrR9SV0+gSrMB7ExQNRyODQq954p2VvZNVcGrkN7uBtF9+2ntNxrw8mwjGm5sM5GOwT3Yq4dtEH4ADqmshawU/q3j7bPQ63CH0T13QPY1v7fFjgklWcGao1vDPwCtTBHRff+G6h1Kag1MjxV/6Q3/nEr+/ewcV+T/cbo3h2Ukj0LHSteHbVyFmFjZSb7x7SeoUmJ7CbXPZI9EVUG26KK9glgtB3bGfgU+kyKbY9sc+9OsvN/DEyN2ozkOd7QriGR/HWBN6Dv3m/QjkZSxu3RjvUa0fs5so3sr5rs5HfbH9jB/l8b7QzkDmMUbjurvqCn/k3Rw7cb6rZYDrVSfo8Fh6C91qeIXHH09NEn17jZXtpxaCN/FXADqsCeBPaOz7f/EwU2H+3FjUGV1yPonKKV0FDpnwF7RPmGpWSfhzYus6y8F6GuzXfbi5wle6j9XYC6Y7ay7SSy7ji05/oksFebezgDHbObYv8/jlqlyYv7LLBjdP7ISPYewAu0GtVDUKV3GWplP91OtuWZYudvh1p2TwAX27Ed0YY4/u3SDd8Cu0/DrDwP0wpU2Nryb5fOb/+viLqnP4N2Yt4B/BpV4kdaWXqVP5K9F2pdLIcqjR9E925bk71Tjuzh6Hjyg2jAw36oS/LN0e+eee+aWvdI9j5ohzbpkJ6CKtuZdh8ex96ZNs/dXOCT0TvzJDbmjFpUTyf3zu7vsEj+vqiSnmXbyb3bEXWHPk6b4Dj7bW6N6vIj4E22PQt9n+N751GaTU7xA4BaEc+mXuytUKvoFnQgfi/bnxnJFv1/E2qdrY66LE9Bx8J2jfPTMxpsZ5O/bbRvQ7TXdiuqRHspLNseH/3/UdT1MxdVuu9Cle2OKdljojwz7MVMeqLjUCV7GNoYXY5NJ8iqe1TWG+38zaw+j6FupseIpkKkyruONRKb2fZkdBxvD1TZnoqNVWbUO1bcU0z2pdYQTEOtwi+gvd7cqRjo2NHjkZzV0Ll7X7ff8XVlH92/dFnm2r2/Am2I3466oT6LjTvlyN7dZCeN4mjUHfwttPPyeAeyV0Mj+b6JugL3QAOLLsPC8dv8bo2pe+p52dqej0TZrUDLnfgAOlbZ5/QdNPr4p6jbHvTzZjfReu7jYLG4g7w52rYkHpRVLC1AA1RuxKKJ2/x2Q9Dxumtt+1TUK3WnXbttJHlVqfaG3FMHP5KuPHIgLRfiZahlMQRt6L+GuiOGoRZD4qLIenHXQRvbraJ9n0d7nqvmyB+PDiyvZ9sfRnvEK6IDzz9EldVwtOe8ZpZ81FV0JbBftO8CNMIyc96TNSwXYlFj6Djhzej4wsfQHv4jtBTgsKzr2LGNaE1x2BBt6E61hmAlVBGtE50/wu518pKuilrVb0Vdod+zlLzsbXulaGP7Bvt/CupyvgztpQ9HreVJqTxTaLlUR6Kh2wvst94NDRDYy+qwFa0o0/S93w5dOSfZ3hy1si+mFdU7LJVnHcwliH4T8hbgLVaO/YFz0A7K8mhnKfO5Q62fWPY4u+9foeUOzHpWG1l39H3/Gq0hizehwVTboO/hHajSnGBlG553D21/HEi1Jhrgc7Ztb2L3cNPkGuhz/llaQw7bW3nmoVbqnagHaYN2cqO6TIju48+A66J2ZVta7Url0xDSyYNWBgdbokER80S/vv4ArYHhGejDeAqqaH4XbHWRkDxFrbX2trHrrArsJiJz7LzD0Llk1+YEtkw3OfuJyJqoO+JS9KUdjyqkd6DTEf4RQvh1Il9aa2vugq4o8aLJ3tPOOQlVNu+zpYrS/Af4CbCmiBwfQvg58E80OuwJ9IW5D7V6QYMReiEib0Bf7KsssOAJ4Bq0AT0bVTQvhRCei7K9iirXICIXB12q7AWT+VAIYVv05d8uR6Yk6wNaoMB2wDdEZI2gS0h9BW2APo5aLX9CJ8vHzER/l31DCP9ErdsD0HHHfVCX0tYhhF+HEH5o9yddjo2BPwDvEJFzAYIG1DyCBj2cZ0Eg6Xs3Dvi8iLwl6AeMf4A29vegVsdo1EL+dwjhmfRzZ7JnoR2HQ0TkPDv+ezSycS2r2wpkr+vbyLqHEP4bDTi5VXRt20Xos3gtGuRxMTq+PiWE8J8Qwr8zZCfP3QzU67KjBVL9GjgIDWK7MITwWAjhmyGER5Nr2HP+B+BkC/56HLWeLwZ+iXY0rseC2GK5GbLPB3a3Z/4/IYSNbPtz1lZ9L4TwTNZ1+oX+1qieqkn2kN6CujEEHRROepWT0V7b6qk8Y2gNyG+EWkNrolbShWhk5SxUmV1L5CLNkL8DatWchvZyp9EaoF6LaPDb9o2nFWiyMWrFTUcbkvegCnsf9KW5DdgyQ2bi3hmFNjbXkZpThwYHPEHkXs24zu6oYpqLjhXeQMta/jDqkpqak3co2gv+f5grKDo2C3UFZU65SMn/KerSOh/tsCSW3jvtd12vTf590Z7xzqgr6QBave8d0GChVaP7FbufZwPPoL38CcBLwMft2BzUHbVBhsxkrHYbNPL3INveltbKO1uhjfEaUb7lov83QDtHiQvsceA8O7aFPQMb9nHvGlV3egZ23YQq2MQKXcX+JuNtuVON7Lzd0CUCT0HHx3ekZQ2ejw5LzIAe7tNY/sdQq3rTuH7oe/Q0sE0fsk9HPT+3oGOViaV3AvAntE3qd6uuR7kGUpinkj+WvuyfR10ryUuwH+pe2D917gzUt78uqlQ+D3wmOr4ZOn7wTWsIdrf98cOftfTSFahLJokmO9ge/v2j89ZHxzY2R6PNbgC+GR2fgroF77eytxusXyHatxeq9E6w7Vmo/3/vVN5ptNyMM9EIyE2i+3K+7TsI7QRskyN7TPT/BqjSuzS6zv1kjD3Y/U4ayU3QHv2Wtr28NSTP2D3IVNYZ9/5AO3dBtG+e3b9430zU4l+O1njnEdFoHWZCAAAgAElEQVTxtVAr8nPAy0SBRRllSBr+nVDL4i22PdRkP52SvYE9T2vY/79Nfis7vjqtid6/wdyVXvdez12sOG9ChxuS9317NMCjV4CKyZ5s/2+MBufMte3jUOW5Pzr2+GVSq7lE8uM5fWejc+o2RZ/dzcl4Z+3ezrH/N0Rdosn2gVbv96NTeG6jzQpG/Zlqb8Q95fwwPUPg30LLz723vbCHoSHCe5IaMEaV3I+BA217VXQFlW8QrfOH9nzXAGa2kb8jugLJrqhltxk67nQSqsxmEQ32o439Ilph/SuhQTB3oQo7ue5QdPC911qX0Tl7oJbZGdjka9QFeTXw/qSuqTzrYRFg6FjPKWg02a5RGcehlurniRqt1HUWoA3N5ZGsGagr5wrb7jUGE9X/zbb9NnRu0aEpOSeg0zZ6NbpRGTZGe8HJmOhBqLWTBASdQ7T0WFT3pHEeh7p7F6WuvwpqMW3WRvbmds4U294BtXaSer2LaK3R9O9u+24HXkxdfyW0Qcy07Jpad1oKdg+0Q/SR6Nh1qIU2Fp2asElG/vXRTsFOqEfkJTSqMl427a3oGPrD9O4gJ/L3RJ/xM2l5kE5DldQs1HOzXobsx9DI7WGoB+Nhei4TuKdd5z6iMfyBTrU37J7a/Dhq0TyOjvHcja4IMdQentvRwJGhqTzro+Nkv03tH4tOOzg/62VvI/+naAjzXZZ3ZWuMrkEV0bCU7OeBJanrjEaj6T4B7NtGXnytefYSbYO6Wx8FjrNj+6HuqImp/OuhPe9jU/s+hg76z0qdn7h7hZ5RabvYfd8Yjej7LS1X2ExUUfZa69BkPUO0YLbd9/eiinuXrPqSHbCxB9qTPx2dH5nM6zvAft/d6Bm5u67d+9tS1xmDRuF9qYvnbg80xP50dL7XDrZ/W3Ss67CMej+LBvCMSh37Ktr4dey6alLdU8/8fFSpz0XHym6m1alKAst6BWVZGZ4CDo72zbFn8di0PKI5rfScq7eryd8UHeP8Kq2I6Y+hHeYVM2T/AutcR+/I3WhHd4XU+YlbdEBdma/Lr0Oop5wfQ8fikvDkddBw6zXRsa7n0Z7eu+343phvPco/FQ3wOAD9xM33U8fHoS7Jy8nu4a5Ny5KagFqSE9FxlCdQy+oS1DLblGj8A7X2HkXdF1ejLsN4OsFKqEvjU6R6l3Z8hpV5RdR18i5UgSZLbx1ojUoy13B8Kv8G9pK+jI4XxMtEzUQtvcvJnoCfuD3HokEGB9Ca3/RDVOk+RSuce3TGNTZAAwkeQQNqZqTu+9vRIJW85abWoDUZfkNU2a+Nup9+j1oYSVTcIcD2qfIvtnt7Dqpg47GlVVC3cuaiwPZbJ0plfbSTs7bd+/9GG/QkWnKHuA5Rvc9Fo04vpfeCyJ8Dnmjz3Dey7qiiPhZ95kejynlTVKEvRq2qr9Ma++q1TBqqcB5HO3rvTB3bArX03t5G/lno8zkK7ZBuYvJ/Ytt30JqKsU4q//ro8/4reo9vb4RaeieQUpJ1ptoL4Ml+iJZLJlk0djSqBObYQzUZdS3+HPhgzjUOxSZz2vZC4Aepc8ZZ47B+hvwf03JFjrQXP5lUPhVVvD9HLcW0ZbkzPcc0PosqkXjOX7Ig8owM2d+jp2U2EnXF3kVr/O0b2PqHqfxjUVfJm1DFex/a8KWV3tmoa3ellOzvoEt6xddcEbWid7Lt69Be9/SM+74C2qM9GG1gr0cthLTSOw4d53k9yMKOrU80YdquMQNtYH9i+65Eo1PjhbkTF9wHsGAedIzmCqv/ain5nyPV0aFlFe+aKs+2wGLbPhn4F5GFGsk+OpI9B7UELqX3lytuQyMq0/eukXU32Y9hLtjo/ZiGvgvJupx/sDplrdYzEXWlHm337Fbg5NQ5c+0aaWW4HvpeHxXtWx4NrPo2rQ7IL9D2YtVU/jVQhfZm9F39Nubqj87ZEG1TPkQ/TSTvNtVeAE+v97SeAA637WG05uAcSGt1hJ3toc4c8KW1GkjsJslSesNT29NR90cSaDGclv9+J+Aa+397tDFvF9mWjjK7l54KJq0oJ6Auw8RyG4mOWS6PKoav24sz1xqOLIUzhp7KZQ6q9N6Tkr0hFmxj22ugAQmJ7OXs5VwJ7fFehzaiu6PWZy/ZSZ2IlDDa878eHbOIyzWe3m7YDazh6NULR3vHZ9j/b0IbwrYRoXbu/qg1+156TpxPzzVb3655dMZv91bg6ugZ+A4ZkbQZsuegbuC2X8hoct1RpfZoLJvWMnqTUNfldCvj18iJxkQVeRJsNgIdb78V+HDqvC3puYrJJLS9eW9ybzCrGQ2ueQRV+uuggS5Z3qAxRMFeaCDat4HLU+dt3Mm9G6hUewGanmhNbr6TVs9xIS03yjQ06OHTqFszzyUWK7nlU8duBx7LyTcUtbp+RGt9x4XYWAXqUv0r6hZaQnaQRSx75dSx61G34Mo58tejNY9wBGrFnRUd/yga8fk0kfXawX2dhSq9d7eRPRp1M95gsr9Kz0nC70Yt1cfbySaj92qN1fXoRN1eQUHRb/8C8PXkPlp5ksbnqOgaj5LxyRVyJtqjDf8nUAXe63uAaKfmu5HsoajySZ67nVEX22WoJZI1bWR4juw5qDX9KVLWjtc9gM5Z/RnqmRiOKrhzomfydNRj8Dw5kaQ5z9wIWmtafijjeNK+7Ie+G3NQi/oeok8pWfkeRt34WVHIeRPcJ6FKr+0XQupMtRfAUwDtTX0cDQJ5CLgodXw9dPxr+5z8iWU3BA0myYriuoNodZXUseloj/oa1AVxfur4mqi7LuvFj2XfnFVG25/5FWRai/Rei1p6vV4W1ArMW71laHSdHst6odF2D6Ou4Lxv0q2ABsD8nYyPhqKuzXYf84zrn458S6aDnEHGuJ+ds6XV+1i0kb0kOpYst3ZpTsMTy74R8wpExw9C3YGTc2Rvhrqo34daz5+Ijq2ARqqeRXYnJ5b9peT3SdXr46Tc11731885E+1YPoStoxodG4tav5u3yR8/93Ek5ghsgQPafNMOVWqfRV2ivT6fhSqvvJVrYtnpeXwT0TnBV+XJrjPVXgBP9kO0ohEfpDWheyg5DXWUL3757kDdaMuhEZbDabPUVuo60+0lXIRZJCa/3VJdadmnoK7Ao60MbWUTRSmiFtGXgAuj47nf88qRf3T6fqGTj3spW3q6sEaic+y+3KnsHPknpOts9cr7JltS/7noRNzvR8d6fWE+1bDEsheiVsEoLMAhOi/zq92R7M1Q99Z32tW9D9lnmuyZqTyZlnWT607PBaVPQINDkqk1Q9LyOnjuHqL3PNQR6Bholisyln8QOkY+n57Rmu0+9BzLfhAdchF6Rs1Ooo9J8XWl2gvQ5ETvxnkzdCWQk2nTO4zOT17cIWgwxIno2NcPiAbDO5GPKqgJqBvok2QEGPQh+8Mm+7vkRIVlyUaV6g72/0bouNnl7V66VP5E/kkm/0as15nXcKTyJp9zGY32eNt+Xb2N/KT+30Aty1z56frb31nAH+kZRJDlthpCb0WbyH4YeJsd60b2hmg04rF91bmN7EXAu/qS3eS6R/njqQFnoS79Oe3y5jx337DnfjS6GES8SEM7b8QwWpGp70DH2g+gTQelD9kXYCsHLe2p9gI0NaUenutojVHMQZf9OpeM5abQQI6x8XVSL9+9RCs8dCj/FlpRcmuhSu+zpFygqJtpo5Tsu2gpmyKy7yBSkLRWNLk6I9/rSjbKHyubB/qSnyH7/dF1R6GutcyvTdOKnIvlfyOSf1+B+t9Ea0HrrdG5X+/OyDMutT0EHds8MZL93i5l30rre2Sz0DGbD2TkeUOG7GSeVceym1z3lOyH6Lky0anoONrsNvmFnp3M+J2/n1R0Zh/yHyT6TiA6Xvol1FrLc/3nKfv7SQXJLM2p9gI0MWU8PKfZw5MMmu+Ijl2k570MQxvkC2mNKx2bevneF52faSVlyD/F8r+Nll/+JKIVIezcC9AQ6eTzOG9EQ+2TBz+W3Yl1FVtmN6Fu1aGopbdhKt94NPJu7Sj/bVHZ03Xva7wtVpTfpPWdr9HAxhl5V7H7npwn9lskv929BeqfuOOWp7Uk1FbA39CxkESxjkSnglwVXecktKFcHg0UiJex6uR3T9xxyyf1RRv+F4nGvaye1xN1AtCxtdO7kd3kupNvGZ1JS4mdTWphBNs/nWixBvT9+AE573yX8i+m1Y4cQ+q5R6cixZPZh6ARqydmyaamyeTdpNoL0LREezfkUdF5Y3PyT7UX9iwsGhNVhHenXr68BredK/KY6LzlM/K+AXU3nkfPSedfwpbfypJNNZbZ9ugY54loCPQYdOxhtJU988WjOqssWbHlCnRuotBaNf8Hfb349O2OOzo6Nx3pOgSdRHw9cIHtW87yfp/IMsmR3ZE7zo73miSMehU+D3wh2jcKjb5tK7vJdaekVWb5dkJXeEk+lvoGVDmNprfC7auT15Vlhj7ff6K1pNoK6OL1o1GLtM/2ZmlLtRegCYnq3JBJ9OEUy38urRXUd0ifF21X4oq0vGui0W8X0bL0Nmsju7RlFh3bBQ03P5lW1OYHidxg9FR2lVhl0fGZqGXxSVqBPW+m54T5Xvc+td2nO46M4AX7zTZHI17Pj56rBW1kd+2Oy7sHaAfjNno2/Du3y9fUutOlVdZGbnIv5qHzRQ+OrnczPZewi+9XacuMVluzPTp95G3RsauwL7138t4sTan2AizriQrckNHDN5HWZ2UmoFbSx+i5uvmQVN5SrshI9vq0FtMdi1p6F5Nye2aUvZBl1qY825nsk9BJssPbnFvKKsu55hR0msEn6b1iTPrel3LHRfc+njy/MdrYnRefl/W7UcIdF8leFbO60B7+V+jZ8A/J+d2bXPdSVlnWM4Wun/sXWotDjMm7BhVZZpHsnVCld2Ty23Za/qUt1V6AJiRKuiHt2L7oYPfXUKtmBVpfRj6fnK+VW95Crsho/z7o/LybUMtuXXR+2ifsurnzhSx/V5ZZeh8aYn0c9j0vNJT9ClSJrt1H2bu2yjLkz7NrvAVdPHtNdPzlSjLGXaL8hd1xkewFaKfoclqLZ2+EBhVdnifbzivritzbyvl5bGIy2mjeik3a9rr3rnf0zHRsleXUf1P02U86ufPtmslXUHpMB0jlLWSZRfnnokEs0217OyKl1678S3OqvQDLeooeoCl04YZMXWNbdKxjVVS5vYAqzxXRxvcucpa9iq7RlSsy2j8btYbGoY1+spbmDLTxv4qMpc4yGrGOLbNUvr3RpY5ORFejOdcanlnoRPlTSM3bypA9hQ6tsgz5e6EL+R5hv98tqJt2NdR6vIY2i+NSwB0X7d8VXeljU7Sz8j+0ltvaFG2M235XjAKuyOQcdIWTaXbvX6O1xN0KaEer7Vc3mlp3ClhlGdfYE13u7xz081bJ9xR3s/Ic3IH8QpYZumj6M+j7/itaCnYbdKGAt7Yr+9Kcai/AsppoKbqu3ZAZ15qH9rgWoEuA7Yv2VK9GG97cybIUdEVGx2ZZ2h2dJLuTNSK3o/MGe4UxU4FlFt2vW9GpEvujk4Q/hSr9UegUjg1yZBeyylLXWhVddmyKyV9k+W+1Y2uQiqRNlaFrd1zqOoejFuqeaKdjR7TDcaodX6GN7ELuuOj47qgbeAHqWZiJThu4qt0z09S6U8Iqy7jWTFoKdz6qZH5OayHz+dgamhnyS1lm6PqZPzTZu6DLCT6IfUgX7Xzv1K78S3OqvQDLcqKgGzJ6eLfAFBO6esLVtObLXWLXmdpGfteuyEj2NrQ+7DoUtaySD82ehs6Vy+1hU8AyS8lf0Rqm6bS+2DANXUj4aXSdw7xGt7BVFslP1hWdhHYafmLyN7bG5+tkrKcY5e/aHRfl3QwNuBluz8zXaa0xeZM1QmtnXSO6912541K/e7LSz0h00ex9bfti4B/o2Gg7d1jj6m7nlLHKssaft6P11YazTP52bfIUssyi+id/10HbnsX2O7wTnS5ySJ7swZJqL8CymijphrSH9wWiyd/o+nwP0ur15q6GQkFXZCT7OXquhn4K8F/owrM/60N215aZ5UteuPnoPMRE6exKy6W0E/AZ8hdkLmSVZcj/PK3vkG0KXGv/J67ZXnP1ousUdsehDfbi5N6jDe+NqBLZDf3MTbvnprA7Du0o/Jyebr8L0cn5B6LBV71+N697Mass47nbi+jTX6iiuSK6r98lf03aQpZZJHtvdKH25KPIB2NWMfq+3k/q+5uDMdVegGU1UcANGeWdhn152LY3sgd2Bqo07yO1fl7GNbp2RVq+CaiSSGTPRdfcG2ONyOeyZFOBZWb5d0F7qVtH+1ZDPwL6GXuR5+fILmSVpa61A/oNsK1sewjaWD6KBmD8Dzkr2EfX6NodZ/uTz0Ql7qg17b4fgVqpT9LHFyMo7oqcgn4VIvlMzdq2702odfMTeq4OkmflNKbu6XtAAass2r8X+vHZ+dG+XVFX8KX2/G2RylOJZYZ2cH+Kfd3c9s1A24tb7HcZtG7MHnWtuwDLSqKkGzJ+EFEX4qX2sl2CTsz+Mq3vV43NyFOJK9LOuxiN4LwKVRKvL+pMK8o0S3Zhy8zOGYJagu9AxzoOQ91gR6Ljj4fR+0OalVhl0fXORHv1I9GVZ+6itSD3jmQs/0QF7jir70ZoZ2Yr1PV6H2opTLVrrtbH717UFTkUDSRaiFrwl6FzFF9M7nfWM9fkulOBVRbVfTj6jm2PRrHugnpldrAynYetwpQhv7Blhr5vgnpEDkC/A7kXOvxxCNqWnUj08dvBnmovwLKUKO+G3Aa42f7fH11jczd7Cd5OS+nk9RILuyLRaLqb0F71HGsotreXcW/g033UvWvLLJV/TXsB90QtgvvtRX8rqnRWaZO3CqtsCjp9YxbwG7STcao1Wj8ixw0a5S/sjkOt0WTx4avR6SqHW2P0UaLVQHLyF3bHoYrgYrtnp6E9+mT+2IeBs9s9c02uOwWssoxrJB20T6Hv+7fQTu79wLmpc7PG7ApbZrQ+8nyy/UbfQ9urG7GpJHmyB2uqvQDLSqIaN+QIdLD5qtT+uahbJbfRpqArMso/HF2N4SqiYBJUmTzSR96uLbNU3vGoUnsrOr64Ma0ozo3QwJs12sjv2ipLyR9jjc3pVt6JtOYLrm33flKbaxRyx9EKHz8c7RQcmfG7P0XUgcm4xhSKueMS2VujQTxn0zNsfQs6cGU1se4UtMoyrrMq2rE6CLWOD0+eVav/fei7kVZ0pS0ztEP4c/QTRUPR9yRZwH42+s5NSMse7Kn2AgzmBOXckFHeN9AKYx5pjcTnbHs99JM1++Xlj67TlSvStqdhPWBU4d6BWnrLW+NxQzvZlLDMUtc5wMr8FuxjqeiYzNNkfADUjk+hhFWWutZO6Dy9k4Bptm8Bajnu1+4ZoIA7zrZXt7/DrKG6Av3K+vJ2zeeAvdrILuOKTCyLIVbu5NldER1/XdROdpPrTjmrLG4zRqDW8T3AYdH+PdE2ILMMVGSZoW7on9FzIv4e6Du3IC/fYE61F2CwJ0q4Ia3BWMMe2rfTUnpDgZeBG2w7s9GwfYVdkag1cykaRj0jkv04qmTHYpNlM17cKiyzGWhPNOl572PXexvqDt2b1nikpGSXssrsvJlo5yCRvx26DNqpaEdgNtZLzrn3hd1xVr8ngcNte7jlXYguPTeUltWUJbuQOw5VMGOAvwLHR7/5NmiH4wI7Z2Ke7CbXnYJWWeoac2gtPjEC7djdCxxq+y4kx/1PScsMVXKz6Pk9wCeB99j2+4B5fbV7gzXVXoDBnijghsx4EfdC/f5vAdayfR8A/pe+A0y6ckVmyN4Y7Z2eQivY5gi0h9129RY7t2vLLCkHGrn6Watr4mZ6OzrudyiRmynnGoWssij/hmigy+WR/H3s9zwRCwTIyFfaHWfnvcmekXih32+iHZiJfcjuyh2X8btvjY5tvjPadw06fWPdNmVuXN2pwCpLlf9G9N1MlN4otOP2c/Sd6GtieteWWST7XFQpb07rSw5HoZ2AY9rJXRZS7QUYrImCbkha1sSuqOvvVLRHtiXaU/0gcDQ68Nxu3k/Xrsjo7x5or/x61MraEO0xX4WOhfX1Mcqiltnr0wewlTisLFcAH7Lt6SY/b75UYassyjOBlltoQ7veldF9vZPU9/hS1+naHRfJnmu/746otbErGnhwuN3X+2k/x69rd1wkexvUIjrEZG8A/AFdDWc7NJQ/t95NrjvlrLKkDPEXUy5CXZHJNd+EvpNb5VyjkGUWyV492nc82rnY3LZ3RF3CO+fVf1lJtRdgsCWqcUPugk7OPR5Ver9B3XCboT29++n5eZF0w13GFbkdGj32RtSqew7t7a2JupO+lm40Mupf2DJDleEia2CuQ4Me9rH7eTdqHbQbbC9klUX590Ub2e+jVvUuVv8vogsFPEP74KDC7ji0kXwRbeweQC2UDa3BeQwNYX9jjtxS7jjUzf4CuqboLXbvZ6Lz1r6Fdlj6mufWuLpTnVW2O9qRuh79UoqgCzF8B/iIla9XRCcVWGYm+7toh/gaNJjrXfa7XYZGcW+R114tS6n2AgyWlPESlXFDvp+eXyl4J+reSayeUWmZGfILuSLtnPOj7SOtIUoU9/A82ZSwzKJzFqNz5JazF/BS1EJe1e5l3jy7UlaZnbcWqugSy/gMu4dJ3RfQwWoSFHDH2TnXYMrU7sFZ2CeK0E7KqnGdc373oq7IszCFAkym5/jyaFru6LYNXlPqTgVWWepdfRFdCeZAu86n7NibUetsj1SeSiwzdKz1WTt3E1TJ3o12EHZEOyzLzDy7vlLtBRgMKXr4yrohd0EVzGm0JmQnPbgb4oc7R35hVyTayzsJ7RV+Bu1hJu6Ra4H1YlkZ+QtZZlHZV0OV2ldpTUwfhq4+09eXlwtbZZH8iahFci8thTcM7eWe10Z2aXccuurOWFS5Xh7d992sTiv3IbuwO87KuSlqBd0ePW+boBbDOK97bv0LWWWp8o+2ciads2FoBOstwJysPCn5XVtmkexV0TYiUa5DUXfwDeRY08t6qr0AgyVR3g25rp0zEZ0381+Wbyjac32cNmH0lHBFomOK96GW0Ai0l3oW2vvbFlUY7RR115ZZKv88VNFsYS/6PGzxZrQD0C6ir7RVhvasH0Mby0vQqNLE/fVG+x3aRdWVccfNRQMM5trvfBGtcZ/10Qa13bcMy7jjZll5Z6Eh/FcAJ0fP44O0scqaXHcKWGXpdx99zi+2+v+SnhPUb8Q+G5RzjUKWWSR7F1SxzUYXfYgt8guIrOQmpdoLMFgSBdyQ0blrW8NwMy3/+yTUOrkBVWRt571QwBVp2xPR+YD30nLFTEDHwT6Drv7SSzYVWGZ27nqoMk5Wjj8G7W2fjirqZ0kNtlPSKsuQ/21ay1ztD3wa7bV/GHieNivAWJ6u3XG2vZbd37Oic49BLdNvowqjr3GzsyjgikTHmZ+jtczVCmgDfCtqoTxKB738JtWdCqyyaP92aOdqV9s+FPXAHIkGwLRbG7OUZYZ6ni6gtaTgrmjH4QQ0mvRR7H1oWqq9AEt7oqAbMuM6p6CW1Rxs4Wg0umwsMLlNvq5dkRkNwJvR3vSB9Bx0H4EpzBzZZSyzIag1eBpRNJkd2xvtIV+dNAgZ+ctaZclqGG9GLdi4szAbXf3lHKKP8ObUv2t3XJR/ddQSfp7WCjgjUNfc1lm/XZS3lDvOzj0J+COtJdeSBnUGNkcx7x42re5UYJWlrnM/8CdawWsrot6I+9F3af+cfIUts+g+3Y5+nihe5m8btJP7afpY8WlZTrUXYGlOFHRDRg/vHHQViCSc+iNoVNmmmKXXh/yuXZGR7O1QJZn4+A9HF47ejw6+vEwByywlP7E4V0QtqcvJ+WhljuxCVlkkf1S07yDUDXt0F7991+64SPZ69pslVv9pdi/7XLzazu/aHRfJ3hDtoCTWz7vRjsOWXvc+ZXdtlWWUYVi074fAHanzRtDy8qQ7poUss0h2PA/3C+j7OjTaNySdp2mp9gIsrYmSbkjUinkMbei/jvXU0Ab7XjI+vprKX8gVGcl+BA2uuQPt7Q5FV1K/DY0uy/s8UGHLLHrx5qPuo1PQCfDLocr+orjMGS98Kasskr8AbZQvxz6NggY9XAMc28FvX9gdZw3T0+i8rEW0LOKTLO9Gfcgu7Iqk9QHST6AdkmTKyjvQTkLbaMKm1p2CVllG/nn2nB8THfsBcHsf9S5smUWyd0e/+/g+WkuqfRVdXrDtJ7GalGovwNKcKO6GXA8dUF8dtS6eR62Tw6Lr5n5mJtru2hWJKuXb0WCWA9GVJ65HFZiglt4mebIpYZnZsd2tYdoFnau3CLUqR6DW6eXkWwelrDLLt5vJn4W61H5DawmsI1C31Fp9XKOQO85k/gy1cA5Gp6i8ZPnEfoNZHdSha1ckGmTxGLrowAK04X40Kv+7iL7L5nWvxiqLzpmPdhDnoWuJXk5L4T8GfLON/FKWGfrMP4kuKfg06snZ2I59G/hqN+/QspxqL8DSkqKHr5Qb0vKMQ1ed2Bq1tNZFo9seJ6cBj+SXdUWuhLqdZqGh4+ugUZRPAx/tQ3Yhyyzavzw6+Xs9u9aP0XD271lDNJLUN9GoyCqz84ehY30z7XrfR+dLPge8w87p1VGIylDWHTcBbZh3BhbZvtvRsZiV+rj3Zd1xI9Hxzh3RTsYQtMf/u7j86d+uqXWnpFUWXwdV6gutHkk0911o5ypZtH2rnLqXsszQjum1JntXVNF/Gn2Pk0CvPjsaTUm1F2BpSpR0Q9q58Ut1FLZ6ul37C5irpY38Qq7IjGstwFZOR3uA19B+6aSuLbOc64xDIzsfwD72io5D/hhzFWXkKW2VRddayRqgu2hZCbfaNduFoZdyx8W/Pfq5omRC/ltQK3vbPmQXdkWmnrn3R7/7nnbfc5eJa3LdKWCVtbnWKmjH9oeowqqb4LsAABtUSURBVB0H/B39gkSm4qIiy8ye9wnoOzfK5C+x+mR2Npqaai/A0pIo6Ibs45pbAP9GP93xLDkRiXZuIVdkm+ttBLxqDckSbG3LnHO7tsz6kL2G1WV11GL+HDkrYVDQKutD/mh0nHUH1OK4EXPF5ZxfiTsuut5x6Djn+60BTHraWe6oSlyR0fX2QjtWH0fnTs7t4/zG1Z2CVlkH8meiSmcF1MuykNQ0hujcSi0zdNrEo+j0jbVRhdlxe9GUVHsBlpZEATek5ctcQ49Wj3dbdOJs24VZKeCK7KtMaBj32ztpNChgmfVxvc+gyyC9QB9zhyholfVxzTPRHvOzHcjvyh2X1Xinjk9Dl5m7iT6+2kBBV2Sb662Gdpgup4NvmjW87l1bZX1cb2V0SsPdaIdt9z7Or9QyQzsnP0bbjMZOPWh7j+ouwNKQ6NINiVoQbechxdft9IW1c9u6Imkps74anraL2ebk6dgy60SuNX5TOixvx1ZZu7qlfstVaU3Mbztnz/62dceRWlwgqxxZcvJk06U7roN72LFsr/vr53RslXVyXXt3tiFn+kLG+ZVZZqjC3JAOXNBNTcNwCPa0GE8D14nIULS3+K4QwtPJQRHZGG2Y/1tEfoOOe7wYQng177qp6/fFL4EPishw1LX6thDCEyZ7XeBwEbkxhPCSiEj62iIyNITwnxDCa13ITMr73yLyCupK3QBtAH8RXXsy+lmWp9E6/yWWadd4TUSGhRBeDSG8kL4XbWT/r4j8F+pK3Qo4KYTwTKpuY0MIfzQZQ5I6xvchhBAi+X/oRH507HfATBF5P3rvDwohPCUigjaGF4nIU8Bv7Df4k4gMDyH8u4+6ZcpO7X8WmCsiH0c7OseFEBZb/dZFP6T7UDs53cjOON64uhtL0BWTvoIqnHeHEBbFJ4hIMg+XEMKTyXXj5y55HkMI/4MucN1pGV8UkdvQKUgroqsXPRbJXg74d/J+RfuzZL+GdlScPOrWuHUkCrohUSvkDnQ8bRS6tt+V6BhAErZ8GK0vb3dlZdHGFYn2AH+LuksuJsNyQidob1FGtv3fyzJDx/d+jY4zPISOk6SXBFuz23ueUYdMqwxVwL8k+tAuqQAe2ozTpa+XczzTHYd+wfoZdD5asq7i/UQrfqCWSVfWcEp2pjsOtQD+F/hX+n5H5xxC3/M6G1v3vupPG6vMnvvn0U7uw8DpRZ7xPsqWaZmhQywL0U7AiD6u0VEwW9NT7QUYsIpW4IZEe2D3YBOf0YCL01Cll4x7fRKdJJsO/y7likQH+E9BXY3notGMU1JlPgVViCNSeSdbw7AJ0dhA+iWhzbQL1PI6zf7fBA0ouA4bp0CV/tmkxvvo+XmV3PlEfcheER3fuxANlb8iXQe7L5eQMdBPSXccOtZyfbIPjVy9AF31Yyw6FnUWGt7e0bU7kW0N4VvQD+vuh46H7p4q2yh0JY5rsQhDr3sAXbhhJvZeZsnLKm/q3KHoWHSy0stU1II6JzrncODajLzLkaGEOpVv9/YHqLvzYvT9Sr/XR9BFJKmnwBAagLkhvwN8TkSuE5HpIpLpzg32JCV/Lf9oERkZQvgr6vrYXkQmBXVjno++oB+yfMehQS/bR/nXBc4UkSkhhGBuonQZh1r+11L7R4vIiBDC48AlQd0tXwf+BpwgImtHZf44+pmefaP866GD8juiivlkEZln5//HzlnTtnu5ZSNGoeHbBHW53GH13FVEVkIbpI2Sc+y6GwCPichVSd2ieibumPX6km33/TL0KxXvAdYXkSviOgAvAq+hyji+fzOAL4vIhXa/xlg5hrepayI3eQaGmcyjg/IvtKPzI9QF9k90VZ5pQPzcrCsi28fPUqeYnNfQHv63QghfQzs0nxKR+dFv/g80wOevaAPd+LrbM/Ug+tmu60Xk9Ix6Jc9jbhtoz9ZPgWDv/4toFPO+InKWnXYvsJKIzI/kb2Tl2kVERqTrlpLf4zeLSKYDbYt+WPlAYDsRGRnlvxkYJiLvzKuDk6JujdvfiZJuSDSC7SZaH3ndBvgU2vNM9g1FX7DJtr1GlL+wKzKSPSGjXnPQaLIz0bX+rkIVb9pyKmSZRfcunux+jclLetgzUctrW9veDPig/V/KKovkr5KxfxI6uH+VbU9Ee8QbJPJtf2F3nP1uh2IftLV79wKtuZlD0cbv6ijPXtH/hd1xsWwsRD46dqiVYzMr06m2f6fUeY2sOyWssuh4vOLPPHQi+IRo31qo5bV19I4l0cWlLLOU7LgtOB0dTphn24nbf/v0b+8pP9VegH6vYDk35PpoxNjbUvv3tJfqRHTB143tpVojdZ5Q0BWZJzt1/QnoGod/J1pVPXXt44HvRPsnoUrvInQgfioamXl4Kv/G6Fymb6LjF+vZy38J0TgGOpb3PrLdWbtbAzARVVBXpI6Ps3L0qmNK/mfQb/LFS0BNsXJ/C/g5Gd/Eo6A7jp7jld9FlfYsdMrKs8CRdt6O6FzF1VNyC7vjMmR/nNQcSjSK9S/AK8A+Ob97k+v+bnTS/EjbXgudZ3eWba+Ovje9FiBHO5nfRJ/L42m1F/ehc2STa34C2Ca511H+1dExtxVoKaldknzRed8i9eWDlOwTUtcVNK7gQqvbr9H3f4X+ajuXxVR7AfqtYmodJA/nsfbwJWvxDUMtohuj8y8lWpQYnVPzbeCmaN+e9uKvjCqkD6LuwoforXBG01p/MynHbFTpXUbvJbYuBQ5sI3t3dNmxtaJ9WwL/xAb6oxe+sGUW5Y+t4s+gim6BleOTaCfiMDQibdtU3sJWWY78Xla5nXeI1T9zvheqUL9PNI8SXZz6AlpW7y52/djiTlvFx6GRq3PRJeYes3v6X6Qa3egaY2h5DQ5BG/75qXPWtPs6po3sxCLfLTpnKtrJabd4eaPqTgmrLDonbRVfas/hCFTZfN3KdDDwK3ou8jwKeo+T0qFlliG7l0Vu530BXWu0kV8sL5tqL0C/VKqkG9K2R6EW3Fn2gN+Jjt99Hh2/mGLnrZLkjR74Uq7INrJvQSfoTrfz1sNcSck1qMYyy7KKz0BdNBujvfiz0J5mHFVX2iprIz9tlU9ELYz9U/d+MiXccbadZRUfB3zCttc0+Rvkyaa4K7KdRb462vi+nchqanrdKWmVRfKyrOJL0PdvOLAPahHfTs/nvrRlliP7dYvc9o9HFW2PZ95TF7qh7gJUXqFq3JDJS7wiqhQejl54sQfxpG7kp87pxBWZJ/t8e3EkXWZKWGZ2nb6s4quJrOKU/NJWWQfyr0oaBds3JVX/wu44OrOKv5W+Z9H5hd1xHcq+i5Z1Mjw6N2vaSGPqTgmrLL5/9n+eVXwJNiZo+0a2kV/IMmsj+wKrxxDU87Nuup3y1HmqvQCVVqakGzLKE3+aYxTqk49fjJOAUzqU37ErsoxsO1bIMrNzu7GKey3knCO7I6usgPxJOfUv5I6jO6v4vR3K7sgdV0Q2GQ1dU+tOQassyv+6ZRqVP8sqjud/Sh/yO7LMupB9ZZH20FPGs1p3ASqtTAk3ZHSNJIJwCLrM2IjUAz4LHQvotTZmG/l9uiLLyKaEZWZ/C1vFHchua5WVlZ86v2t3HCWt4j5k9+WOq0R2k+tOAass2tetVTyO3u1FIcusCtmeCuiIugtQWUVKuCGja8QK5z60oR0OjLf926KKq92Xh7t2RZaRTXnLrLBV3KXsPKusiuCgMu64FShuFZd1xxWWXVHdy3gEyta9jOxSVlm0r6hVXNoyKyrbU7lUewEqq0gJV2Cc3160O9CJ5KPtpUzm2Iyh9emSTMuwiPyisqnAMqKgVVyF7DLy7W9pd5wdL2IVV+WK7Fp22bpT3iNQuO4VyK7MMqKYVVyJ/CKy855fT52n2gtQSSVKuCFT1xkCfAP94OvyqOVxoh1rtxZfafndyqaC8Ur6tkozreIqZJeRb8fLTJ0YCywXbW9Ld1ZxbbIrkF/WI1CbbDteyjKivFVcWH5Z2Z7Kp0G/tFiyUr8tEXQPOkAc0J4VIrIt2hs7PYRwf5vrDEHn7jyMjjt9A7gzhHBRf8svKPtfJu8lETlYRO5EX8bjUWX0fyGEpCE6KITwpYwlzYbA60t3XYu6lD5o+wIaUZe19FEVssvIh1aAwJKgS0wdiy7BtBP6Hb3j0bGViagV+j0AEZmJLkN2gi2Jhh27G220DhGRLdHGZxz6Ed2lSXZy34rIXx/9mv1DIYQlJv/76PO2NXBoB/LrlA29l7j7Jvq1g0NCCI8CewAfBfYIISyMn7toicFbROQGW4LsNnQBhtPsmk+iS+ZtXqX8imQ7Zalb45ZJlHBD0upVjYuuM9Hyf5fIDUS+S6SoK7KUbEpYRjllP4rOA2RKyy4jP3WNbqdOLI9aILeg6zS+l2hBcbTRfh99WKZ1yabctJEqxkrrlF3KMqL8YgplrMLKgpM8lUu1F6B0BQq6Ie34Ptb4XAe8Ax0n2gp4T3ROn183KCK/jGyqHa/sNjinlOwy8invihxGqyOyOTpf6r2kJiGjVnp6vLA22fZ/WVdkFQsp1CG7qnHaQgFCVcgvKttT9an2ApQqvD4oXwdORZXNfcAJ0fF2Cmdz1H2wGjoJfCG9Vz/o6/MhheSXkU1Jy4hyVnEVVllRq3gm8CfgZHp+4mg/1GX8IToLkhkaXXNW/JtZ3okZeWqTbcdKL6ZgfytbSGGAZFdqGVF+MYUy00YKBSd5qjbVXoCuCluBGzI6vg/aw97VXsKptn9Kf8svItuOF7bMUtfp2iqtSnYR+VTjDkx/+y/5LefYNT+NTg7ebmmRbedUEZxU5UIKAyLbjpWdtlHWKi8zZaV0cJKn6lPtBei6wAVdgVEjsw7ae9sIdSs9jvWs0R7752izAnkR+VXIpoRllrpO11ZpVbJLyC/rDozLf0Ryj6Pf5Xjg32RH9dUm246XWkyBElZ5nbKjc4pO26jKKi8ydaIS2Z6qT7UXoKvCFnQFRg/iHugHUtdFV4C4DJ0Qvg+6evnjtLFQisivSnZybbq3zKqySouOVVYlv6g7sC/LdBV0ncMD88pQl+xIZqEAoQ7kl1lIoV9kU820jcJWeVn5ZWR76v9UewG6KmyXrkB6ru6wIdqb3CbaNx1dAuk21Lra2/bnKY+O5feD7DLjlaWCc8rILiufcu7ATizTYbQa4fRXK2qTnZbPAC1mUKdsqrPKClnlVcgvKrvd++OpulR7AdoWroQrELXC3or11lClc6X9vxymkLDvaAGjY5ll5Fcsu6xlVMYqrWKstKoAna7dgVHeTMu0j3LXJjtD/lEMwGIGdcqmYsuILq3yKuV3K9vTwKXaC5BbsJKuQHvQpqON9jqWfwkwOzpnR+C4quWXlR2dU8W0iaIBMqVll5RfhSuyaBRtbbI7lN9ngFA/1r1fZFORZURBq7wK+UVlexq4VHsBehWoQlcg+pXj84Bz7MU7GHgJXfj1ANQtkVZWlcgvIjuVv+x4ZZkAmTJW2UAF6PRyB1KBZVqn7C7kV76YQd2yE/nRtbq2jChplZeRX1a2p4FJtRegR2EqcAVG19oNjS47AJ07cwo6IL032tjehC7/Ez+UlcgvIjuj/GWmTZQNzilqlQ1IgE4f+fp1MYH+lt2X/Hb5+7vu/SWbCiwjSljlZeWXke1pYFPtBehRmOpcgRugimVz294Z+AQ6GL2K7evRO61KfgnZZcYrS1mlZWRXIT/jegM+oX9pkF23/DpkU81YaeEAobLyy8j2NPCp9gL0KlAJVyDqklgJeAC1TDaNju2AhhefZg9k3stbSH4Z2dHLVWS8sJRVWkZ2FfJTZRjwCf11yq5b/lJQ98osIwpY5VXJLyLbUz2p9gL0KExBVyC9e2vroou5foCe4cU7AzOqlF9GNhVYRhS0SquQXUZ+xr2vZUJ/3bLrll+XbCq0jOi/xRT6lF9Etqf6Uu0FeL0gBV2BUf49UXfKOahFNcEevvcQhRf3h/wisql2vLIrq7RK2UXkZ+SvbUJ/nbLrlr8U1L3oWGlVlmkRq7CyKTueBj7VX4Bq3JAz7GE9FrVKfor2MCfbNd9HamC6KvlFZVOdZVTEKq1EdlH5Gdeoc0J/bbLrll+z7NoWMygrv6xsT/Wl+gSXcwWuAqxo/28K/B54f3R8S3uAx6Af1tyiKvlVyI7OLWsZlbFKS8kuIz/aV+eE/gGXXbf8pUR2LYsZVCW/iGxPS0+qV3hBNyRwEXBqtP0t4PnUObcAG1Ytv0LZhS0jylulpayyMvKjhmfAJ/TXKbtu+XXX3c6pezGD2hZy8LR0pPoEl3NDTka/OrxhtO8edAX3dewF/SWwWdXyK5Jd1jIqHJxTVHZZ+dQ4ob9O2XXLr7vuUf66FzOobSEHT0tPGjhBFbkCUd/7GNTSOjR17C7gL6jVsmXV8ovKjs6pYryyqFVcWnZR+dQ4ob9O2XXLr7vuqWvUuphBEflVyfa09KSBE1TSFZjxEm6PWmXzUvu/CPw4na+M/ApkVzVtomurtCrZReVbvjon9Ncmu275NcsuZRlR42IKZWV7WnrTwAkq4QqMHt6dgY+jK7ivhvYwH0d7ntOi878PfKsK+VXItv1FLKOqrOKiVmHtAToM0sUElhb5dcimpGVEjYsplJXtaelOAyOkpCvQztsT9cEfiiqqy2z/AuBa4EKiOTREH2csK7+MbNsuahmVDpApKrsq+XbOgE7oX1pk1y1/oGVT82IGVcgvKtvT4Ej9e/GKXIH2/8eASagPfhHRyuVor2wmcCVqdeS5lzqWX0Y21VlmXVulVckuKj/jGgM6oX9pkV23/IGWTc2LGVQpv1vZngZP6r8Ll3AFom6SVe3/5FMkH0XdK9+j5YNfALyJVm90aPR/IfkVya7CMisanFOVVVZrgA6DcDGBpUF+XbKpeTGDquQXke1p8KT+vXhBVyD6WY6v2kv3JDAVHXT+HnCSnbMt8AtgpyrlVyGbCsYro+1ureJSVlkF8mub0F+n7Lrl11336P2pZTGDKuSXke1pcKTqL1jSDRkd/zT6WY4jbHsM8EbgO+gcmseBvfpDflHZdm5hy4gSVnFZ2VXIj/bXOaG/Ntl1y69Zdm2LGZSVX1a2p8GTqrtQBa7A1PV2sQf3UWDjaP/y9iJPs22pWn63stP/23ZXllG0XcQqrUR2Ufmp/HVO6K9Ndt3ya5Zdy2IGZeVXIdvT4ErVXaikKzB6+GYB82l9luNEu95EtCE/p2r5Fcgua5mVCZCpYspGrQE6DNLFBJpcdzuntsUMqpJfVLanwZmqvVgJV6CdvxfqZ78KeAj7yjCqeB4CHgPe1B/yK5BdxDKrxCotItv+1hqgk26EGESLCdQtv2bZtS5mUJX8IrI9De5U7cVKuAKB9YAHgTVR5fMy6qbY345PzcpfRn5Z2ZSwjGx/aau0qOyy8qNrTKamCf11yq5b/lJQ91oXMygivyrZngZvKpe5hCsQtS6Wt/+n29+Z/7+98weVo4rC+O8GX2HKaBFBJNiYQtMIKRTJgyiB2AliwMpERLARSxHBQmwTKyvRNDbBRuxsxcpKQcQ/dSrBRhCLa3HnwTru292598x8szvfBx/Me3P3/u68tzt3z505ZyjVy7+nTD4fAr9QIpdNhV0H8VvZxF4vHBSVRrJr+L3XyhL6lWw1fwbHLi1mUMuPYNv77fYOKpcCKTkxnwE3KJPTY93vbwIfd9tXuzflxUh+K5ugtIkVzpCoNIxdw+9vdz9PktCvZqv5KjbiYgZR/Bq2fViue1HDUmDX9iQK+RL4m/9WTLgE/NZ94H4ErkbxI9grbZvSJqi8QaaFHcGnckmMPS8moOaL2dJiBhH8WrZ9WB7WuH0p8CLlpPpq19cN4AvKt7PzK+2eBt4Hno/it7LX/C0GR0YrbVpvkKlmB/ElCf1qtpqvYqMvZlDNb2Xbh+VhjRuWAoELlJPsrTX93ga+A46AZ4CbK/tSKz+IHRUZ1UTFEVGh9Aadbt++FhNY8rFLixm08FvZ9uF5t0Yxy5CvAXe67TOUtfi3KI/qSJTHdnwD/AS8FMlvYff6qble2HxzTi07go8woV/JVvNncOzSYgZR/Br2tvOhvb/e3iBoKZBy6/C3wDXg066PH4DPgU+6NpeBJ7rtFMWvZffGURsZHVMfFTenbLTwu33KhH4ZW80Xs9XFDGSFHGpPpPZ+ePPOgKXAld+dBd6mfMu8BzxHqXX3FHCXlWdZRfMr2a2RUXVU2spu5a/pS5nQL2Or+WK2rJhBLT+KbR+uN+8MWgrs9Xmu9/OV7s34CP+fqEL5A9nH1EdmrTfnVLMj+Gv6mzShfy5sNX9qNgGREcJiCi1sexnevLNhKXAruERm1ynfNF+ckr+JTfv1wgtURqWt7FZ+f5uJE/rVbDVfxUZczCCSP5RtL8ubd1YsBe4ELSfcZynR2abnU4XzN7GJuV5YFZVGsFv4a/qZPKF/Dmw1X8FGXMwgkj+UbS/LuzUasBS4M7hMPOe77Y19RPPXsYm7Xjg4Ko1i1/L7/SFI6Fey1Xz1sXdtZcUMWvgRbHs5HtZ4h2XIUQc7Ip+4yKjmBpmwa5WVfFlCv5Kt5quPvTcWdTEDWSEHezneveGOy5CjDXRkPsHXCxl2g0wou4J/jC6hX8ZW88VsaTGDVn4L216uhzUesAw5ymBH5DPu9cptN+eMwt7GR5jQr2Sr+epjX+lHUsyghR/Ftpdp+QDmZgKvFzIwKo1kb+MjTOhXstX8GRy7tJhBK7+FbdvyAczVBF0vpCIqjWKfxkeb0C9jq/litrSYQSu/hW3bJ5YPYI5GeL1yCjbahH4ZW80Xs48RFjNo4beybfvE8gHM1QivV47NRpDQPwe2mq9gIy5m0MpvYUd/buz9t3wAtuCfPnFC/1zYav7UbMTFDCL4tWzbXmf5AGzhP3+ChP45stX8KdiIixlE8WvYUZ8P+/AsH4CtN8KCAkq2mj8mG30xA1khB9s+zQ9gLVoppSPKN+R3gPdyzl8vga3mT8D+HXg9pXQNeAV4EHiS8sid6znnN1NKl4E/c84/p5RSzjmv6yjn/BdwO6V0N+f8x8oxXAIeBx5OKd3vvT6EX8m2rLVKfp9Y3cn3oZzz/U0nvkNjq/ljslNKZ4E3KA9P/RW4Q1lifJSS2H0r5/xPZd9HwAvAR8C76ybrsfi7sC3rNHnCs6wDVkrpXC8yukLJd3sZGBwZrUSmH1CWLL+aij+UbVl9ecKzrAUoMjKqiUyj+OoVAWu/5QnPsg5c6shIzbesE3nCs6wFSB0ZqfmWBZ7wLMuyrIXojHoAlmVZljWFPOFZlmVZi5AnPMuyLGsR8oRnWZZlLUKe8CzLsqxFyBOeZVmWtQh5wrMsy7IWoX8BvwFySgneSVQAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_dist( pragmatic_listener(10000) )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Pragmatic Halo\n",
    "\n",
    "\"It cost fifty dollars\" is often interpretted as costing *around* 50 -- plausibly 51; yet \"it cost fiftyone dollars\" is interpretted as 51 and definitely not 50. This assymetric imprecision is often called the pragmatic halo or pragmatic slack.\n",
    "\n",
    "We can extend the hyperole model to capture this additional non-literal use of numbers by including QUD functions that collapse nearby numbers and assuming that round numbers are slightly more likely (because they are less difficult to utter)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "#A helper to round a number to the nearest ten:\n",
    "def approx(x, b=None):\n",
    "    if b is None:\n",
    "        b = 10.\n",
    "    div = float(x)/b\n",
    "    rounded = int(div) + 1 if div - float(int(div)) >= 0.5 else int(div)\n",
    "    return int(b) * rounded\n",
    "\n",
    "#The QUD functions we consider:\n",
    "qud_fns = {\n",
    "    \"price\": lambda state: State(price=state.price, arousal=None),\n",
    "    \"arousal\": lambda state: State(price=None, arousal=state.arousal),\n",
    "    \"priceArousal\": lambda state: State(price=state.price, arousal=state.arousal),\n",
    "    \"approxPrice\": lambda state: State(price=approx(state.price), arousal=None),\n",
    "    \"approxPriceArousal\": lambda state: State(price=approx(state.price), arousal=state.arousal),\n",
    "}\n",
    "\n",
    "def qud_prior():\n",
    "    values = list(qud_fns.keys())\n",
    "    ix = pyro.sample(\"qud\", dist.Categorical(probs=torch.ones(len(values)) / len(values)))\n",
    "    return values[ix]\n",
    "\n",
    "def utterance_cost(numberUtt):\n",
    "    preciseNumberCost = 10.\n",
    "    return 0. if approx(numberUtt) == numberUtt else preciseNumberCost\n",
    "\n",
    "def utterance_prior():\n",
    "    utterances = [50, 51, 500, 501, 1000, 1001, 5000, 5001, 10000, 10001]\n",
    "    utteranceLogits = -torch.tensor(list(map(utterance_cost, utterances)),\n",
    "                                    dtype=torch.float64)\n",
    "    ix = pyro.sample(\"utterance\", dist.Categorical(logits=utteranceLogits))\n",
    "    return utterances[ix]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The RSA speaker and listener definitions are unchanged:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "@Marginal\n",
    "def literal_listener(utterance):\n",
    "    state=state_prior()\n",
    "    factor(\"literal_meaning\", 0. if meaning(utterance, state.price) else -999999.)\n",
    "    return state\n",
    "\n",
    "@Marginal\n",
    "def speaker(state, qud):\n",
    "    alpha = 1.\n",
    "    qudValue = qud_fns[qud](state)\n",
    "    with poutine.scale(scale=torch.tensor(alpha)):\n",
    "        utterance = utterance_prior()\n",
    "        literal_marginal = literal_listener(utterance)\n",
    "        projected_literal = project(literal_marginal, qud)\n",
    "        pyro.sample(\"listener\", projected_literal, obs=qudValue)\n",
    "    return utterance\n",
    "\n",
    "@Marginal\n",
    "def pragmatic_listener(utterance):\n",
    "    state = state_prior()\n",
    "    qud = qud_prior()\n",
    "    speaker_marginal = speaker(state, qud)\n",
    "    pyro.sample(\"speaker\", speaker_marginal, obs=utterance)\n",
    "    return state"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "OK, let's see if we get the desired assymetric slack (we're only interested in the interpretted price here, so we marginalize out the arousal)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "@Marginal\n",
    "def pragmatic_listener_price_marginal(utterance):\n",
    "    return pyro.sample(\"pm\", pragmatic_listener(utterance)).price\n",
    "\n",
    "plot_dist(pragmatic_listener_price_marginal(50))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_dist(pragmatic_listener_price_marginal(51))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Irony and More Complex Affect\n",
    "\n",
    "In the above hyperbole model we assumed a very simple model of affect: a single dimension with two values (high and low arousal). Actual affect is best represented as a two-dimensional space corresponding to valence and arousal. Kao and Goodman (2015) showed that extending the affect space to these two dimensions immediately introduces a new usage of numbers: verbal irony in which an utterance corresponding to a high-arousal positive valence state is used to convey a high-arousal but negative valence (or vice versa). "
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
